package solution.T0215_1_Clipboard;

import solution.T0215_1_Clipboard.command.ClearHistoryCommand;
import solution.T0215_1_Clipboard.command.CopyCommand;
import solution.T0215_1_Clipboard.command.HistoryCommand;
import solution.T0215_1_Clipboard.command.PasteCommand;

import java.util.List;

/**
 * 你收到了一个开发任务，需要开发一个剪贴板，满足客户的下列需求：
 * 1.用户在需要复制文本时，执行复制操作，系统将内容存入剪贴板历史。
 * 2.用户可以执行粘贴操作，默认粘贴最近一次复制的内容，也可以选择粘贴指定的历史记录。
 * 3.用户可随时查看复制历史，搜索过去复制的内容并进行粘贴。
 * 4.当历史记录不再需要时，用户可以清空所有存储的剪贴板数据。
 *
 * 为了实现业务逻辑和前后端交互的分离，提高并发性能，后端业务代码采用多线程实现。一个简化版的实现方案 CommandExecutor 已经实现完成，
 * 你可以通过 executor.submit 提交任务。
 *
 * 与你对接的前端工程师小王已经设计好了UI界面，并且定义了前后端的交互如下：
 * 其中，on... 风格的函数是用户点击前端页面时，前端调用后端的入口，
 *      executePaste，displayHistory 两个会直接作用与前端，引起前端的页面变化。（回调函数）
 */
public class UI {
    private static final CommandExecutor executor = new CommandExecutor();

    static {
        executor.start(); // 在静态代码块中启动 CommandExecutor
    }

    /**
     * 复制
     * @param text
     */
    public void onCopy(String text) {
        executor.submit(new CopyCommand(text));
    }

    /**
     * 获取最近一次的复制记录粘贴
     */
    public void onPaste() {
        executor.submit(new PasteCommand(this::executePaste));
    }

    /**
     * 指定复制记录进行粘贴，
     * @param id 复制记录的id（注意不是当前粘贴操作的id）
     */
    public void onPaste(int id) {
        executor.submit(new PasteCommand(id, this::executePaste));
    }

    /**
     * 清除历史
     */
    public void onClearHistory() {
        executor.submit(new ClearHistoryCommand());
    }

    /**
     * 获取完整的复制历史
     */
    public void onDisplayHistory() {
        executor.submit(new HistoryCommand(null, this::displayHistory));
    }

    /**
     * 搜索内容中含有 keyword 的复制记录
     */
    public void onSearchHistory(String keyword) {
        executor.submit(new HistoryCommand(keyword, this::displayHistory));
    }

    /**
     * 处理粘贴操作
     */
    public void executePaste(String pasteContent) {
        System.out.println("Pasted: " + pasteContent);
    }

    /**
     * 前端展示复制历史。
     */
    public void displayHistory(List<CopyCommand> history) {
        System.out.println("History:");
        for (CopyCommand command : history) {
            System.out.println("  - [" + command.getId() + "] " + command.getContent());
        }
    }
}
